package 集合.List集合;

import java.util.Iterator;
import java.util.LinkedList;

/*
    linkedList底层维护了一个双向链表
    LinkedList中维护了两个属性first和last分别指向首节点和尾结点
    每个节点(Node对象)，里面又维护了prev,next,item三个属性，其中通过prev指向前一个节点，通过next指向后一个节点
    LinkedList的元素的添加和删除，不是通过数组完成的，相对来说效率较高
 */
public class LinkedList01 {
    @SuppressWarnings({"all"})
    public static void main(String[] args) {

        Node node1 = new Node("小王");
        Node node2 = new Node("Tom");
        Node node3 = new Node("小萌");

        node1.next = node2;
        node2.next = node3;

        node3.pre = node2;
        node2.pre = node1;

        Node first = node1;// first指向了链表的头部
        Node last = node3;// last指向双向链表的尾部

        Node node4 = new Node("smith");
        node4.next = node3;
        node3.pre = node4;
        node2.next = node4;
        node4.pre = node2;

//        //遍历链表 从头到尾
//        while (true){
//            if(first == null){
//                break;
//            }
//            System.out.println(first);
//            first = first.next;
//        }

        //遍历链表 从尾到头
        while (true){
            if(last == null){
                break;
            }
            System.out.println(last);
            last = last.pre;
        }

        LinkedList<Object> linkedList = new LinkedList<>();
        linkedList.add(1);
        linkedList.add(3);
        linkedList.add(2);
        System.out.println(linkedList);

        //默认删除第一个节点的元素
        Object remove = linkedList.remove();
        System.out.println("删除的元素：" + remove);
        System.out.println(linkedList);

        //set 修改
        linkedList.set(1,444);
        System.out.println(linkedList);
        Iterator<Object> iterator = linkedList.iterator();
        while (iterator.hasNext()) {
            Object next =  iterator.next();
            System.out.println(next);
        }
    }



}

class Node{
    public Object item;//节点数据
    public Node next;//指向下一个节点
    public Node pre;//指向上一个节点

    public Node(Object name) {
        this.item = name;
    }

    public String toString(){
        return "Node name= " + item;
    }
}
